package com.bestcem.xm.award.service.bo.award;

import com.bestcem.xm.award.entity.mongo.BaseEntity;
import com.bestcem.xm.award.enums.AwardIssueTypeEnum;
import com.bestcem.xm.award.enums.AwardSettlementEnum;
import com.bestcem.xm.award.enums.AwardStatusEnum;
import com.bestcem.xm.award.enums.AwardTypeEnum;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 奖励元数据表
 *
 * @author sh.pei <sh.pei@idiaoyan.com>
 * @version v1.0
 * @date 2021/9/15 19:52
 */
@ToString(callSuper = true)
@Getter
@Setter
public class AwardAwardBO extends BaseEntity {

    /**
     * 项目id
     */
    private String projectId;

    /**
     * 奖励类型
     *
     * @see AwardTypeEnum
     */
    private Integer tType;

    /**
     * 奖励状态
     *
     * @see AwardStatusEnum
     */
    private Integer status;

    /**
     * 机构id
     */
    private String orgId;

    /**
     * 奖励名称
     */
    private String name;

    /**
     * 奖励基本配置
     */
    private Basic basic;

    /**
     * 抽奖奖项列表
     */
    private List<Award> awards;

    /**
     * 抽奖发放相关信息
     */
    private Issue issue;

    /**
     * 页面配置
     */
    private Page page;

    /**
     * 限制规则
     */
    private Rule rule;

    /**
     * 抽奖 红包 奖励 是否已开始
     */
    private Boolean activated;

    /**
     * 实际领取奖励的数量
     */
    private Integer curCount;

    /**
     * 钱包活动id
     */
    private String activityId;

    /**
     * 清算标志
     *
     * @see AwardSettlementEnum
     */
    private Integer settlement;

    private BandPoint bandPoint;


    /**
     * 限制规则
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class Rule implements Serializable {

        /**
         * 可选,答题时间限制
         */
        private Integer time;

        /**
         * 可选, 单人抽奖次数限制
         */
        private Integer draw;

        /**
         * 可选,单人中奖次数限制
         * 可选，单微信号领取次数限制
         */
        private Integer win;

        /**
         * 可选 账户访问限制
         */
        private Integer account;

        /**
         * 可选 设备访问次数限制
         */
        private Integer device;
        /**
         * 可选 ip访问次数限制
         */
        private Integer ip;
        /**
         * 可选，单日领取次数限制
         */
        private Integer day;

        /**
         * 可选，奖励结束是否停止投放 is stop deliver
         */
        private Boolean stopDeliver;

        /**
         * 可选，设置的问卷分值
         */
        private Integer sscore;

        /**
         * 有效期内达到抽奖次数提前结束奖励
         */
        private Boolean stopAward;
    }

    /**
     * 发放相关信息
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class Issue implements Serializable {
        /**
         * 兑奖操作提示
         */
        private String tip;

        /**
         * 发放方式
         *
         * @see AwardIssueTypeEnum
         */
        private Integer method;

        /**
         * 可选,兑奖码前缀
         */
        private String prefix;

        /**
         * 可选,短信通知内容
         */
        private String sms;

        /**
         * Optional. 短信模板id
         */
        private String templateId;

        /**
         * Optional. 短信模板名称
         */
        private String templateTitle;
    }


    /**
     * 奖项配置
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class Award implements Serializable {

        /**
         * 奖项等级
         */
        private Integer level;

        /**
         * 奖项名称，列表内唯一，10字符以内
         */
        private String name;

        /**
         * 奖项描述
         */
        private String desc;

        /**
         * 中奖概率
         */
        private BigDecimal prob;

        /**
         * 奖项图片
         */
        private String img;

        /**
         * 奖项数量
         */
        private Integer num;

        /**
         * 发放方式
         *
         * @see AwardIssueTypeEnum
         */
        private Integer method;

        /**
         * 可选,兑奖码前缀
         */
        private String prefix;

        /**
         * 兑奖操作提示
         */
        private String tip;

        /**
         * 奖项等级
         */
        private String levelStr;
    }

    /**
     * 页面配置
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class Page implements Serializable {
        /**
         * 跳转链接url配置
         */
        private String url;

        /**
         * 附件列表
         */
        private List<Attachment> attachments;

        /**
         * css自定义代码
         */
        private String gcss;

        /**
         * css自定义代码路径
         */
        private String gcssFp;

        /**
         * css自定义代码路径id
         */
        private String gcssId;

        /**
         * 奖励页自定义代码
         */
        private String template;

        /**
         * 奖励页自定义代码路径
         */
        private String templateFp;

        /**
         * 奖励页自定义代码路径id
         */
        private String templateId;

        /**
         * 手机端页面配置
         */
        private PageFront mobile;

        /**
         * 电脑端页面配置
         */
        private PageFront pc;
    }

    /**
     * 前端页面配置
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class PageFront implements Serializable {

        /**
         * 前端页面背景配置
         */
        private PageFrontBg bg;

        /**
         * 二维码配置
         */
        private PageFrontQr qr;


        /**
         * 中奖标题
         */
        private String title;

        /**
         * 结束语内容， 领奖提示
         */
        private PageFrontText text;

        /**
         * logo配置
         */
        private PageFrontLogo logo;
    }

    /**
     * 前端页面背景配置
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class PageFrontBg implements Serializable {
        /**
         * 背景颜色，color与id+path只能二选一，有color就不存储id+path
         */
        private String color;

        /**
         * 图片id
         */
        private String id;

        /**
         * 图片路径
         */
        private String path;
    }


    /**
     * 二维码配置
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class PageFrontQr implements Serializable {

        /**
         * 图片id
         */
        private String id;

        /**
         * 图片路径
         */
        private String path;
    }

    /**
     * 结束语内容
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class PageFrontText implements Serializable {

        /**
         * 文字颜色
         */
        private String color;

        /**
         * 文本内容
         */
        private String data;

        /**
         * 是否加粗
         */
        private Boolean bold;

        /**
         * 是否倾斜
         */
        private Boolean italic;

        /**
         * 是否下划线
         */
        private Boolean underline;

        /**
         * 文字大小
         */
        private Integer size;

    }

    /**
     * logo信息
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class PageFrontLogo implements Serializable {

        /**
         * 图片id
         */
        private String id;

        /**
         * 图片路径
         */
        private String path;

        /**
         * 缩放比例
         */
        private Integer scale;

        /**
         * 图片位置
         */
        private Integer pos;
    }

    /**
     * 附件基本信息
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class Attachment implements Serializable {
        /**
         * 附件名称
         */
        private String fileName;

        /**
         * 附件路径
         */
        private String filePath;

        /**
         * 附件id
         */
        private String id;

        /**
         * 更新时间
         */
        private String updateTime;
    }


    /**
     * 奖励基本配置项
     *
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v1.0
     * @date 2021/6/28 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class Basic implements Serializable {
        /**
         * 抽奖开始时间
         */
        private Date startTime;

        /**
         * 抽奖结束时间
         */
        private Date stopTime;

        /**
         * 可选, 所有人抽奖次数限制 红包个数
         */
        private Integer totalCount;

        /**
         * 红包详情, 会显示在领取红包的入账通知和详情页，比如：问卷红包
         */
        private String name;

        /**
         * 0: 百分百获得红包; N(>1): 概率红包,预计总参与人数;
         */
        private Long probability;

        /**
         * 可选, 总金额, 单位元, 拼手气红包必选,可能为""
         */
        private BigDecimal totalAmount;

        /**
         * 可选, 单个红包金额, 单位元, 普通红包必选,包含小数、整数、""
         */
        private BigDecimal sinAmount;

        /**
         * 红包页面展示的公司名称
         */
        private String displayName;

        /**
         * 红包页面展示的logo的id
         */
        private String displayLogoId;

        /**
         * 红包页面展示的logo的的路径
         */
        private String displayLogoPath;

    }

    /**
     * 品牌积分配置
     *
     * @author xa.zhang <xa.zhang@idiaoyan.com>
     * @version v1.0
     * @date 2021/8/18 10:41
     */
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Setter
    @Getter
    @Accessors(chain = true)
    public static class BandPoint implements Serializable {

        /**
         * 单份奖励 1-1000
         */
        private Integer sinPoint;

        /**
         * 品牌积分id
         */
        private String pointId;

        /**
         * 品牌积分序号
         */
        private String code;

        /**
         * 品牌积分名称
         */
        private String pointName;

        /**
         * 来源备注
         */
        private String remark;

        /**
         * 可领取的积分次数，可为空，为空表示不限制
         */
        private Integer total;

        /**
         * true表示有效期内达到领奖次数则提前结束奖励
         */
        private Boolean stopAdvance;

        /**
         * 领奖提示
         */
        private String tip;
    }
}
